package com.eudon.user.annotation;

import com.eudon.user.common.utils.CustomValidValidator;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

/**
 * @author eudon
 * @description 自定义统一校验注解
 * @date 2025/9/8
 * @email syd19970616@gmail.com
 * @address <a href="https://gitee.com/eudon">Gitee</a>
 */
/**
 * 自定义校验注解
 * 支持多种校验类型的组合使用，可以在一个注解中配置多种校验规则
 * 适用于字段和方法参数的校验
 * 
 * @author eudon
 * @since 1.0
 */
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = CustomValidValidator.class)
public @interface CustomValid {

    /**
     * 默认错误消息
     * @return 校验失败时的默认提示信息
     */
    String message() default "字段校验失败";

    /**
     * 校验分组，用于分组校验场景
     * @return 校验分组的Class数组
     */
    Class<?>[] groups() default {};

    /**
     * 负载信息，用于传递额外的元数据
     * @return Payload类型数组
     */
    Class<? extends Payload>[] payload() default {};

    /**
     * 校验类型数组，支持多种校验类型的组合
     * @return 校验类型枚举数组
     */
    ValidationType[] types() default {};

    // ========== 长度校验参数配置 ==========
    
    /**
     * 字符串最小长度限制
     * @return 最小长度值，默认为0
     */
    int minLength() default 0;
    
    /**
     * 字符串最大长度限制
     * @return 最大长度值，默认为Integer.MAX_VALUE
     */
    int maxLength() default Integer.MAX_VALUE;

    // ========== 数值范围校验参数配置 ==========
    
    /**
     * 数值最小值限制
     * @return 最小值，默认为Long.MIN_VALUE
     */
    long minValue() default Long.MIN_VALUE;
    
    /**
     * 数值最大值限制
     * @return 最大值，默认为Long.MAX_VALUE
     */
    long maxValue() default Long.MAX_VALUE;

    // ========== 正则表达式校验参数配置 ==========
    
    /**
     * 正则表达式模式
     * @return 用于校验的正则表达式字符串
     */
    String regexp() default "";

    // ========== 各种校验类型的错误消息配置 ==========
    
    /**
     * 非空校验失败时的错误消息
     * @return 错误提示信息
     */
    String notNullMessage() default "字段为必输字段";
    
    /**
     * 非空白校验失败时的错误消息
     * @return 错误提示信息
     */
    String notBlankMessage() default "字段不能为空";
    
    /**
     * 非空集合校验失败时的错误消息
     * @return 错误提示信息
     */
    String notEmptyMessage() default "集合不能为空";
    
    /**
     * 邮箱格式校验失败时的错误消息
     * @return 错误提示信息
     */
    String emailMessage() default "邮箱格式不正确";
    
    /**
     * 长度校验失败时的错误消息
     * @return 错误提示信息
     */
    String lengthMessage() default "字段长度不符合要求";
    
    /**
     * 数值范围校验失败时的错误消息
     * @return 错误提示信息
     */
    String rangeMessage() default "数值超出范围";
    
    /**
     * 正则表达式校验失败时的错误消息
     * @return 错误提示信息
     */
    String patternMessage() default "字段格式不正确";
    
    /**
     * 手机号校验失败时的错误消息
     * @return 错误提示信息
     */
    String phoneMessage() default "手机号格式不正确";
    
    /**
     * 身份证号校验失败时的错误消息
     * @return 错误提示信息
     */
    String idCardMessage() default "身份证号格式不正确";


    /**
     * @author eudon
     * @description 校验类型枚举
     * @date 2025/9/8
     * @email syd19970616@gmail.com
     * @address <a href="https://gitee.com/eudon">Gitee</a>
     */
    /**
     * 校验类型枚举
     * 定义了所有支持的校验类型
     */
    enum ValidationType {
        /** 非空校验：检查值是否为null */
        NOT_NULL,
        
        /** 非空白校验：检查字符串是否为null、空字符串或只包含空白字符 */
        NOT_BLANK,
        
        /** 非空集合校验：检查集合或字符串是否为空 */
        NOT_EMPTY,
        
        /** 邮箱格式校验：使用正则表达式验证邮箱格式 */
        EMAIL,
        
        /** 长度校验：检查字符串长度是否在指定范围内 */
        LENGTH,
        
        /** 数值范围校验：检查数值是否在指定范围内 */
        RANGE,
        
        /** 正则表达式校验：使用自定义正则表达式进行校验 */
        PATTERN,
        
        /** 手机号校验：验证中国大陆手机号格式 */
        PHONE,
        
        /** 身份证号校验：验证中国大陆身份证号格式 */
        ID_CARD
    }
}